

/*
 * log.h
 *
 *  编写时间: 2021/7/23
 *  编写者: wmh
 *
 *  功能描述：5级输出，包含时间，包含定位信息
    可多模块同时调用
 *            支持多模块（运行起来为多进程）日志文件定制。
 *            支持多进程输出到指定日志文件
 *            日志文件超一定大小后自动备份
 *
 *
 *  应用场景：主要用于项目中多进程日志输出
 *
 *
 *  如果需要输出到屏幕等标准输出，参见dbg版
 *
 */
#ifndef _LOG_H_
#define _LOG_H_

/*等级值越大，打印越多*/
typedef enum
{
    LOG_L_OFF = 0, /*关闭日志，无日志输出*/
    LOG_L_NOC,     /*常用信息，无颜色*/
    LOG_L_ERR,     /*严重错误，软件模块无法自行恢复*/
    LOG_L_WRN,     /*警告信息，已采取恢复措施的错误情况*/
    LOG_L_INF,     /*情报信息，描述正常事件流的关键节点信息*/
    LOG_L_DBG,     //调试信息，正常使用不需要的额外信息，打印最全
} LOG_L_TYPE;

/********************项目共有配置********************/

/*日志文件全路径见 log_module_init() 函数里的sprintf()函数的使用*/
/*日志文件存储目录*/
#ifndef COM_LOG_FILE_DIR
#define COM_LOG_FILE_DIR "./log_file/"
#endif

/*日志文件通用前缀，可以定义为项目名*/
#ifndef COM_LOG_FILE_PREFIX
#define COM_LOG_FILE_PREFIX "log"
#endif

/*日志文件通用后缀*/
#ifndef COM_LOG_FILE_POSTFIX
#define COM_LOG_FILE_POSTFIX ".log"
#endif

/*默认打开日志文件备份。关闭将持续写入给定文件*/
#define LOG_FILE_BAK 1

/*备份设置*/
#if LOG_FILE_BAK
/*单个日志文件存储空间占用最大值*/
#define LOG_MAX_FileSize (1 * 1024 * 1024) // 1MBytes
#endif

/************************************************/

extern char *log_module_prefix;

/*调试日志宏定义*/
#define LOG_IF_PRINT 1
#if LOG_IF_PRINT
#define LOG_PRINT_ERR(fmt, ...) \
    printf("error [%s] [line:%d] " fmt, __FILE__, __LINE__, ##__VA_ARGS__);
#endif

/*
    头部信息                                     打印内容
    [日期时间] log类型：模块名：文件(所在行)：函数  打印内容
    例：
    [Jul 28 2021 09:06:54] ERROR:test0 test0.c(14):main{}  12qwha汉字qeqwexasda12 0
*/
#define LOG_NOC(fmt, ...) LOG(LOG_L_NOC, "%s %s(%d):%s{} " fmt, log_module_prefix, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#define LOG_ERR(fmt, ...) LOG(LOG_L_ERR, "%s:%s %s(%d):%s{} " fmt, "ERROR ", log_module_prefix, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#define LOG_WRN(fmt, ...) LOG(LOG_L_WRN, "%s:%s %s(%d):%s{} " fmt, "WARN  ", log_module_prefix, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#define LOG_INF(fmt, ...) LOG(LOG_L_INF, "%s:%s %s(%d):%s{} " fmt, "INFO  ", log_module_prefix, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)
#define LOG_DBG(fmt, ...) LOG(LOG_L_DBG, "%s:%s %s(%d):%s{} " fmt, "DEBUG ", log_module_prefix, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__)

/********************模块私有配置入口********************/
/*

log_module_level_p - 模块打印的最高等级

log_module_prefix_p - 模块打印前缀，打印信息中用以区分模块

log_module_file_prefix_p - 日志文件的模块前缀
                            如果和其他模块设置一样，就输出到同一文件
                            日志文件全路径见log_init()函数里的sprintf()函数的使用

*/
extern void log_module_init(LOG_L_TYPE log_module_level_p, char *log_module_prefix_p,
                            char *log_module_file_prefix_p);
extern void LOG(LOG_L_TYPE enlog_level, const char *fmt, ...);

#endif /* _LOG_H_ */
